/*
不知道用什么数据类型的时候可以用泛型

 */

public class demo{

    public static void main(String[] args) {
        ArrayList list = new ArrayList();     //没有类型 (类型为Object)
        list.add("abc");
        list.add(1);

        Iterator it = list.iterator();

        while(it.hasNext()) {
            //取出是还是object类型
            Object obj = it.next();

            //使用时要把数据转换为自己所属的类型才能用这个类型的方法
            String s = (String)obj;
        }

    }

}



/*
定义一个含有泛型的类
 */


public class GenericClass{
    private E name;       //创建了一个泛型
}


public class demo2{

    public static void main(String[] args) {
        GenericClass<Interger> gc = new GenericClass<>();         //把泛型转换成为一个Interger类型（其他类型也是可以的）

        GenericClass gc = new GenericClass();              //创建一个含泛型类类的对象（obj类型）
        gc.setName(1);

        Interger name = gc.getName();
        System.out.println(name);                    //完全把这个对象当作整形了（前面定义的是整形）
        
    }

}


/*
定义一个返回值为泛型的方法
 */


public interface GenericInterface<I>{
    public abstract void method(I i);           //建立泛型参数的抽象方法
}

//实现接口

public class GenericInterfaceImpl1 implements GenericInterface<String>{   //这里直接把接口的参数类型定位String
    @Override
    public void method(String s){
        System.out.println(s);
    }

}

public class GenericInterfaceImpl2<I> implements GenericInterface<I>{   //这里实现类与接口同种类型
    @Override
    public void method(I i){
        System.out.println(i);
    }

}

public class demo3{

    public static void main(String[] args) {
        GenericInterfaceImpl1 p = new GenericInterfaceImpl1();
        p.method("你好");              //输出字符串

        GenericInterfaceImpl2<Interger> p1 = new GenericInterfaceImpl2<>();    //在主程序中改变参数类型
        p2.method(1);                //输出数字1
    }
}



/*
泛型通配符
    ？：代表任意的数据类型
    //不能创建对象使用
    //只能作为方法的参数使用（传递后可以使用）
 */

public class Demo4{
    public static void main(String[] args) {
        ArrayList<Interger> list01 = new ArrayList<>();     //在定义的时候不可以用通配符（ArrayList<?>不可以）
        list01.add(1);
        list01.add(2);

        ArrayList<String> list02 = new ArrayList<>();
        list02.add("a");
        list02.add("b");

        printArray(list01);    //输出list01的数据
        printArray(list02);    //输出list02的数据
    }

    //定义一个方法可以遍历所有类型的ArrayList集合

    public static void printArray(ArrayList<?> list){
        Iterator<?> it = list.iterator();
        while(it.hasNext()){
            Object o = it.next();
            System.out.println(o);
        }

    }
}











